package br.com.grafos;

import java.util.ArrayList;
import java.util.List;

/**
 * Classe que representa um vértice ou nodo de um grafo.
 * 
 * @author moises
 */
public class Vertice implements Comparable<Vertice> {

    
    /**
     * Nome do vértice
     */
    private final String nome;
    
    
    /**
     * Vizinhos ou adjacências do nodo
     */
    private List<Arco> vizinhos = new ArrayList<Arco>();
    
    /**
     * Menor custo até chegar no vértice 
     */
    private int menorCusto = Integer.MAX_VALUE;
    
    
    /**
     * Nodo antecessor 
     */
    private Vertice antecessor;

    /**
     * Construtor de um nodo
     * 
     * @param nome
     *            - nome do vértice ou nodo
     */
    public Vertice(String nome) {
	this.nome = nome;
    }

    /**
     * @return the vizinhos
     */
    public List<Arco> getVizinhos() {
	return vizinhos;
    }

    /**
     * @param vizinhos
     *            the vizinhos to set
     */
    public void setVizinhos(List<Arco> vizinhos) {
	this.vizinhos = vizinhos;
    }

    /**
     * @return the menorCusto
     */
    public int getMenorCusto() {
	return menorCusto;
    }

    /**
     * @param menorCusto
     *            the menorCusto to set
     */
    public void setMenorCusto(int menorCusto) {
	this.menorCusto = menorCusto;
    }

    /**
     * @return the nome
     */
    public String getNome() {
	return nome;
    }

    /**
     * @return the antecessor
     */
    public Vertice getAntecessor() {
        return antecessor;
    }

    /**
     * @param antecessor the antecessor to set
     */
    public void setAntecessor(Vertice antecessor) {
        this.antecessor = antecessor;
    }

    public String toString() {
	return this.nome;
    }

    @Override
    public int compareTo(Vertice outro) {
	return Double.compare(menorCusto, outro.menorCusto);
    }

    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ((nome == null) ? 0 : nome.hashCode());
	return result;
    }

    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
	if (this == obj)
	    return true;
	if (obj == null)
	    return false;
	if (getClass() != obj.getClass())
	    return false;
	Vertice other = (Vertice) obj;
	if (nome == null) {
	    if (other.nome != null)
		return false;
	} else if (!nome.equals(other.nome))
	    return false;
	return true;
    }
}
